 # -*- coding: utf-8 -*-
# dict 函数   通过其他映射（比如其他字典） 或者（键，值）对的序列建立字典
items=[('name','wangweiya'),('age',27)]
items=dict(items)
print items

item=dict(name='wangkun',age=25)
print item
 
 
 #基本字典操作
phone = {'jack':'1111','tom':'2222','rose':'3333'}
#(1) del 删除
del phone['jack'] #删除

#(2) len  返回键值对的数量
phone = {'jack':'1111','tom':'2222','rose':'3333'}
print len(phone)  # 3 

#(3) d[key] 返回 key对应的value
phone1 = {'jack':'1111','tom':'2222','rose':'3333'}
print phone1['jack']

#(4) d[key]=value  将值value关联到键key上
phone2 = {'jack':'','tom':'2222','rose':'3333'}
phone2['jack']='1111'
print phone2

#(5) key in d 检查d中是否有键为(key)的项
phone3 = {'jack':'1111','tom':'2222','rose':'3333'}
print 'jack' in phone3

#(6)字典键可以是任何类型  (浮点数，元组，字符串)
phone3 = {'1.5':'1111',22:'2222',1.6:'3333'}
print phone3[1.6]

#(7)声明空字典  往里面加键值 
x={}
x['wangweiya']=27
print x    #{'wangweiya':27}

y={}
y['wangweiya']=15
y['wangkun']=13
y['mili']=2
print y  #{'wangweiya': 15, 'wangkun': 13, 'mili': 2}

print '*************************'
#(8)字典的键只能有一个，不能重复，值可以重复，当键重复时取最后一个
phone4={'wangweiya':27,'wangweiya':28,'wangweiya':29,'wangkun':27}
print phone4['wangweiya']  #29


   
#(9)重新赋值
names={'wangweiya':'123','wangkun':'456'}
names['wangweiya']=456  #重新对wangweiya赋值
print names

#(10) 格式化字典
ages={'wangweiya':19,'wangkun':17,'mili':2}
print "wangweiya's age is %(wangweiya)s ." % ages

#格式化html 很有用
html1="""<html>
         <h1>%(title)s</h1>
		 <div>%(body)s</div>
</html>"""
data={'title':'NBA news','body':'James is a great sporter'}
print html1 % data

#字典常用的方法介绍：

#(1) clear   方法清楚字典中所有的项。这个是原地操作，没有返回值或者返回NONE 

x1={'name':'wangweiya','name1':'wangkun'}
return_x1=x1.clear()
print x1   #{}
print return_x1  #None

x={}
y=x
x['key']='value'      #   ？？？？ x={'name':'wangweiya','name1':'wangkun'}   这两个的区别不明白原理  ？？？
print y   # {'key':'value'}
x={}
print y   # {'key':'value'}
              
x2={}
y2=x2
x2['key1']='value1'
print y2  # {'key1':'value1'}
x2.clear()      # clear() 会清理所有                                                                   
print y2  # {}

#(2)copy() 返回一个具有相同键-值得新字典（这个方法实现的是浅复制 shallow copy）  因为值本身是相同的，而不是副本
x3={'age':2,'age1':3,'age2':4}
y3=x3.copy()
#y3['age']=3
#当在副本中替换某个值时，原字典不会发生改变 ，若修改副本中的某个值时，原字典就会发生改变
print x3,y3   # {'age': 2, 'age2': 4, 'age1': 3} {'age': 3, 'age2': 4, 'age1': 3}

x4={'age':2,'age1':3,'age2':[4,5]}
y4=x4.copy()
y4['age2'].remove(5)
print x4,y4  #{'age': 2, 'age2': [4], 'age1': 3} {'age': 2, 'age2': [4], 'age1': 3}

#深复制(deep copy)     使用copy模块的deepcopy函数   无论怎么操作副本，原值不会发生改变.(各自操作各自的值)
from copy import deepcopy 
x5={'num1':1,'num2':2,'num3':3}
y5=deepcopy(x5)
x5['num2']=3 
y5['num1']=2
print x5,y5   #{'num1': 1, 'num2': 3, 'num3': 3} {'num1': 2, 'num2': 2, 'num3': 3}

#(3)fromkeys(para1,para2)  para1:需要当键  para2:默认值  方法使用给定的键建立新的字典，所有的值都对应一个默认的值为None 
x6={}.fromkeys(['name1','name2'])
print x6  # {'name2': None, 'name1': None}

#node：参数可以使任何类型 如下：
dict1={}.fromkeys('wang')
print dict1  # {'a': None, 'g': None, 'w': None, 'n': None}
dict2={}.fromkeys(('firstname','lastname'))
print dict2  # {'lastname': None, 'firstname': None}

#dict是所有字典类型，也可以直接调用该方法   
x_dict=dict.fromkeys(['name','age'])
print x_dict # {'age': None, 'name': None}

#如果不想使用默认值，也可以指定值
x7={}.fromkeys(['age1','age2'],11)
print x7   #{'age2': 11, 'age1': 11}

#(4)get() 方法是个更宽松的访问字典的方法。
x8={'name1':'wangweiya','name2':'wangkun'}
print x8.get('name1')  #wangweiya
print x8.get('name')  #当使用get访问一个不存在的键时，没有任何异常得到None值
print x8.get('name','mili') #访问一个不存在的键时，还可以自定义默认值，替换None
print x8    #   但是X8的值依然是：{'name2': 'wangkun', 'name1': 'wangweiya'}

#(5)has_key 方法可以检查字典中是否含有特定的键。表达式d.has_key(key)   相当于 key in d.   P3.0以后不支持这个函数了

#(6)items 和 iteritems   
	#items() 方法将字典中所有项以列表方式返回，列表中的每一项都表示为（键，值）对的形式，返回是没有次序
x9={'food1':'apple','food2':'noodle'}
print x9.items()	
	#iteritems()方法的作用大致相同，但是会返回一个迭代器对象而不是列表
x10={'animal1':'dog','animal2':'duck','animal3':'cat'}
y10=x10.iteritems() #  x10.iteritems() 返回 <dictionary-itemiterator object at 0x0000000002BD69F8>
print list(y10) #[('animal3', 'cat'), ('animal2', 'duck'), ('animal1', 'dog')]

#(7)keys 和 iterkeys 以列表返回键的迭代器（键会去重）
print x10.keys()  #['animal3', 'animal2', 'animal1']

#(8)pop 用来获得对应于给定键的值，然后将这个键-值从字典中移除
d={'age1':14,'age2':15}
print d.pop('age1') #返回  14
print d   # {'age2': 15}

#(9)popitem  移除随机的项并返回相应的键-值，因为字典并没有‘最后的元素’或者其他关于顺序的概念
d1={'age1':14,'age2':15,'age3':16,'age4':17}
print d1.popitem()  #('age4',17)
print d1    #随机删除一对键-值

#(10)setdefault  方法在某种程度上类似于get方法，但是与get不同的是如果参数在不含有给定的键的情况下设定相应的值。
d2={'name1':'rose'}
print d2.setdefault('name1')   # rose 
d2.setdefault('name_default','james')
print d2     #{'name_default': 'james', 'name1': 'rose'}

# 注意：下面这个案例做法是无效的，依然返回原值
d3={'name2':'jack'}  
print d3.setdefault('name2','liming')
print d3

#说明：当键存在时返回相应的值，当键不存在时返回None, 

#(11)update  可以利用一个字典更新另外一个字典
d4={'color1':'black','color2':'red','color':'white'}
d5={'color1':'yellow'}   # yellow 替换 black
d4.update(d5)
print d4     #{'color1': 'yellow', 'color': 'white', 'color2': 'red'}


#提供的字典的值会被添加到旧的字典中，若有相同的键会被覆盖（update 方法可以使用与调用dict函数或者类型构造函数）同样的方式进行调用
d6={'key1':'value1','key2':'value2','key3':'value3'}
d7={'key4':'value4'}
d6.update(d7)
print d6    #{'key3': 'value3', 'key2': 'value2', 'key1': 'value1', 'key4': 'value4'}


#(12)values 和 itervalues  与列表的形式返回所有字典中值，与返回键的列表不同的是，返回值的列表中可以包含重复的元素




#小DEMO
people={
    'wangweiya':{'num':157,'add':'yaojiayuan'},
    'wangkun':{'num':135,'add':'heishanhu'},
    'mili':{'num':110,'add':'shuianjiayuan'}
}
labels={'num':'phone number','add':'address'}
name=raw_input('what\'s your need name:')
if name in people:
   print '%s\'s '%(name)+labels['num']+' is '+str(people[name]['num'])+','+'%s\'s '%(name)+labels['add']+' is '+people[name]['add']+'.'























